package com.heritcoin.coin.lib.util.bitmap

import android.graphics.Bitmap
import android.graphics.Matrix
import java.io.ByteArrayOutputStream
import java.util.*

/**
 * created tangsheng
 * 2022/6/2
 */
object BitmapSizeUtils {

    /**
     * 压缩bitmap到指定大小
     * @param maxSize kb
     */
    fun imageZoom(bitMap: Bitmap, maxSize: Int): Bitmap {
        var newBitmap:Bitmap = bitMap
        //图片允许最大空间 单位：KB
        //将bitmap放至数组中，意在bitmap的大小（与实际读取的原文件要大）
        val baos = ByteArrayOutputStream()
        bitMap.compress(Bitmap.CompressFormat.JPEG, 100, baos)
        val b = baos.toByteArray()
        //将字节换成KB
        val mid = b.size / 1024.toDouble()
        //判断bitmap占用空间是否大于允许最大空间 如果大于则压缩 小于则不压缩
        if (mid > maxSize) {
            //获取bitmap大小 是允许最大大小的多少倍
            val i = mid / maxSize
            //开始压缩 此处用到平方根 将宽带和高度压缩掉对应的平方根倍 （1.保持刻度和高度和原bitmap比率一致，压缩后也达到了最大大小占用空间的大小）
            newBitmap = zoomImage(
                    bitMap, bitMap.getWidth() / Math.sqrt(i),
                    bitMap.getHeight() / Math.sqrt(i)
            )
        }
        return newBitmap
    }


    private fun zoomImage( bgimage: Bitmap, newWidth: Double,newHeight: Double): Bitmap {
        // 获取这个图片的宽和高
        val width = bgimage.width.toFloat()
        val height = bgimage.height.toFloat()
        // 创建操作图片用的matrix对象
        val matrix = Matrix()
        // 计算宽高缩放率
        val scaleWidth = newWidth.toFloat() / width
        val scaleHeight = newHeight.toFloat() / height
        // 缩放图片动作
        matrix.postScale(scaleWidth, scaleHeight)
        return Bitmap.createBitmap(
                bgimage, 0, 0, width.toInt(),
                height.toInt(), matrix, true
        )
    }

    /**
     * 获取bitmap大小
     */
    fun getBitmapSize(bitmap: Bitmap): String {
        val baos = ByteArrayOutputStream()
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos)
        val b = baos.toByteArray()
        val byteNum = b.size
        return if (byteNum < 0) {
            "shouldn't be less than zero!"
        } else if (byteNum < 1024) {
            String.format(Locale.getDefault(), "%.3fB", byteNum.toDouble()) //b单位
        } else if (byteNum < 1048576) {
            String.format(Locale.getDefault(), "%.3fKB", byteNum.toDouble() / 1024) //输出：kb
        } else if (byteNum < 1073741824) {
            String.format(Locale.getDefault(), "%.3fMB", byteNum.toDouble() / 1048576)//输出：兆
        } else {
            String.format(Locale.getDefault(), "%.3fGB", byteNum.toDouble() / 1073741824)
        }
    }
}